perm filename VERIFY.SAI[SYS,HE]5 blob sn#080526 filedate 1974-01-10 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00016 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	BEGIN "VERIFY" COMMENT THIS IS THE EDGE AND LINE VERIFIER
C00006 00003	α	DACO and SETCOR
C00008 00004	α	SENSINT - initializes sensitivity control
C00012 00005	α	CLIPSET, TEST1
C00014 00006	α	ACC - general accomodation routine
C00017 00007	α	VERIFY - the verification message procedure (SCAN)
C00020 00008	α	VERIFY cont. (SCANSET, HSTGRM, COLWHEEL)	
C00022 00009	α	VERIFY cont. (CNTRST, FINECALL)	
C00024 00010	α	VERIFY cont. (DPYSHW)	
C00026 00011		α VERIFY cont. (TSIG-line significance function)	
C00032 00012	α	VERIFY cont. (COLINT - chooses color filter for best contrast)	
C00034 00013	α	VERIFY - start of body - initialize
C00036 00014	α	VERIFY body cont. - main loop
C00038 00015	α	VERIFY body cont. - return results	
C00039 00016	α	main program starts here
C00045 ENDMK
C⊗;
BEGIN "VERIFY" COMMENT THIS IS THE EDGE AND LINE VERIFIER;

REQUIRE "⊂⊃||" DELIMITERS;
DEFINE α=⊂COMMENT⊃;

DEFINE DISTST=⊂FALSE⊃;	α controls compilation of display code;

REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
REQUIRE "HELIB[1,3]" LIBRARY;
REQUIRE 500 STRING_SPACE;
REQUIRE -1 NEW_ITEMS;

ifc distst thenc
	REQUIRE "DPYSUB.HDR[SYS,HE]" SOURCE_FILE;
	EXTERNAL PROCEDURE FADCHG(REAL X,Y;PROCEDURE F);
	EXTERNAL PROCEDURE FRDCHG(REAL X,Y;PROCEDURE F);
	EXTERNAL PROCEDURE PICSPL(BOOLEAN FLAG; STRING TITLE);
	endc;

EXTERNAL INTEGER PROCEDURE GIOWD(INTEGER ARRAY FOO);
EXTERNAL PROCEDURE TVMOVE;
EXTERNAL PROCEDURE TVREAD;
EXTERNAL PROCEDURE TVIN;
EXTERNAL PROCEDURE INTPNT;
EXTERNAL INTEGER PROCEDURE GETPNT(INTEGER X,Y);
EXTERNAL INTEGER PROCEDURE DDACO(INTEGER DAC);
EXTERNAL PROCEDURE CWHEEL(INTEGER I);

EXTERNAL INTEGER TVWORD,BCLIP,TCLIP,FLINE,LLINE,RSIDE,LSIDE,STVFL,IND,TVCAM;
INTEGER I, FRA, I1, I2, XX, YY, X, Y, L, W, XM, YM;
BOOLEAN DEBUGX, DEBUG, COLFLG, OK;
STRING JOB;

DEFINE  CRLF=⊂'15&'12⊃, TVRESET=⊂STVFL←0⊃, SAFEX=⊂⊃, TTEST=⊂3.087⊃,
	IFTYPE=⊂IF TYP_VER THEN ⊃, LENG=⊂4⊃, WIDTH=⊂2⊃;

α	LENG AND WIDTH CONTROL OPERATOR SIZE AND SHAPE
		(UNLESS CHANGED IN DEBUGGING MODE)
	WIDTH IS THE NUMBER OF POINTS PERPENDICULAR TO THE EDGE
	LENG IS THE NUMBER OF POINTS PARALLEL TO THE EDGE
	LENG=1, WIDTH=5 IS THE PURE EDGE OPERATOR
	LENG=5, WIDTH=1 IS THE PURE LINE OPERATOR;

PRELOAD_WITH [8] 0;
REAL ARRAY CONVLT[0:3,1:2]; α CONTRAST AND TARGET FOR 4 COLOR FILTERS
				      0-RED,1-BLUE,2-GREEN,3-WHITE;
INTEGER ARRAY HISTO[0:16];
α	DACO and SETCOR;

α	set DAC and read A-D with optional type out;

SIMPLE INTEGER PROCEDURE DACO(INTEGER I);
	IF 0≤I≤62 THEN
		BEGIN INTEGER J;
		J ← DDACO(I);
		IFTYPE OUTSTR("DAC SET TO "&CVS(I)&"   AD= "&CVS(J)&CRLF);
		TVRESET;
		RETURN(J);
		END;

α	position TV cursor by keyboard input and return left end in X,Y
		←→↑↓	move cursor by Q units in selected direction
		↔	alternate Q between 16 and 2
		E	exits from routine (returns true)
		D	exits from main loop (returns false)
	X,Y saved in XM,YM for starting position on next call	;

BOOLEAN PROCEDURE SETCOR(REFERENCE INTEGER X,Y);
	BEGIN INTEGER I, Q;
	SAFE INTEGER ARRAY BUF[1:20];

	TVWORD ← GIOWD(BUF);
	Q ← 16;
	FLINE ← LLINE ← YM;
	RSIDE ← LSIDE ← XM;
	TVMOVE;
	WHILE TRUE DO
		BEGIN "MOVE"
		DO TVREAD UNTIL (I←INCHRS)≥0;
		IF I="←" THEN RSIDE←LSIDE←(RSIDE-Q) MAX 15 ELSE
		IF I="→" THEN RSIDE←LSIDE←(RSIDE+Q) MIN 250 ELSE
		IF I="↑" THEN FLINE←LLINE←(FLINE-Q) MAX 15 ELSE
		IF I="↓" THEN FLINE←LLINE←(FLINE+Q) MIN 330 ELSE
		IF I="↔" THEN Q ← IF Q=16 THEN 2 ELSE 16 ELSE
		IF I="E" THEN DONE ELSE
		IF I="D" THEN RETURN(FALSE);
		TVMOVE;
		END "MOVE";
	TVIN;
	X ← XM ← LSIDE;
	Y ← YM ← FLINE;
	RETURN(TRUE);
	END;
α	SENSINT - initializes sensitivity control;

SIMPLE PROCEDURE SENSINIT;
	BEGIN
	LABEL HALF, LOUT, L2;
	INTEGER UDAC, LDAC, I, J, K, TST, PT, CURAD;

	IF TVCAM≠1 THEN RETURN;
	IF ¬AUTOCAL_ACC THEN
L2:		BEGIN "INIT"
		FOR I←2 STEP 1 UNTIL 61 DO TABLE_ACC[I] ← -1;
		AUTO_ACC ← 60;
		LDAC ← 62;
		UDAC ← 1;
		TABLE_ACC[LDAC] ← DACO(LDAC);
		TABLE_ACC[UDAC] ← DACO(UDAC);
		IF ABS(TABLE_ACC[62]-TABLE_ACC[1])<100 THEN
			BEGIN
			OUTSTR("SENSITIVITY CONTROL IS HUNG"&CRLF&
				"TYPE ANY CHAR TO CONT."&CRLF);
			INCHWL;
			GO TO L2;
			END;
		AUTOCAL_ACC ← TRUE;
		GO TO HALF;
		END "INIT";
	TABLE_ACC[1] ← CURAD ← DACO(1);
	J←TABLE_ACC[AUTO_ACC];
	IF ABS(CURAD-J)<40 THEN GO TO LOUT;
	IF CURAD<J THEN
		BEGIN "HI"
		UDAC ← 1;
		LDAC ← AUTO_ACC;
		AUTO_ACC ← AUTO_ACC-1;
		GO TO HALF;
		END "HI";
	TST ← 10000;
	FOR I←62 STEP -1 UNTIL AUTO_ACC DO
		BEGIN "LOOP"
		J←TABLE_ACC[I];
		K←ABS(CURAD-J);
		IF J≥0∧K<TST THEN
			BEGIN  "LOOPA"
			IF K<20 THEN BEGIN AUTO_ACC ← I; GO TO LOUT; END;
			TST ← K;
			PT ← I;
			END "LOOPA";
		END "LOOP";
	K ← TABLE_ACC[PT]>CURAD;
	J ← IF K  THEN -1 ELSE 0;
	TST ← PT;
	WHILE TABLE_ACC[TST←TST+J]<0 DO;
	IF K THEN BEGIN LDAC←PT; UDAC←TST; END ELSE
		BEGIN LDAC←TST; UDAC←PT; END;
	IF LDAC-UDAC<2 THEN
LOUT:		BEGIN "OUT"
		SENSCAL_ACC ← TRUE;
		CHANGE_ACC ← FALSE;
		IF AUTO_ACC≠DAC_ACC THEN DACO(AUTO_ACC);
		IFTYPE OUTSTR("AUTO TARGET SET AT  "&CVS(AUTO_ACC)&CRLF);
		RETURN;
		END "OUT";
HALF:	I ← (LDAC+UDAC) DIV 2;
	CURAD ← TABLE_ACC[I] ← DACO(I);
	IF CURAD-TABLE_ACC[UDAC]<50 THEN
		BEGIN "L1"
		UDAC ← I;
		IF LDAC-UDAC<2 THEN
			BEGIN "L2"
			IF CURAD-TABLE_ACC[I-1]>50 THEN DACO(AUTO_ACC←I-1)
				ELSE AUTO_ACC←I;
			GO TO LOUT;
			END "L2";
		GO TO HALF;
		END "L1";
		IF TABLE_ACC[LDAC]-CURAD<50 THEN
			BEGIN DACO(AUTO_ACC←LDAC); GO TO LOUT; END;
	LDAC ← I;
	AUTO_ACC ← LDAC-1;
	IF LDAC-UDAC<2 THEN GO TO LOUT;
	GO TO HALF;
	END;
α	CLIPSET, TEST1;

α	set clip levels to just include the range of intensities given;

SIMPLE BOOLEAN PROCEDURE CLIPSET(REFERENCE INTEGER INT, INT2);
	BEGIN
	INTEGER BIG, T, B;

	T ← (TCLIP+(BCLIP-TCLIP)*(15-(INT MAX INT2))%14) MAX 0;
	B ← (BCLIP-(BCLIP-TCLIP)*(INT MIN INT2)%14) MIN 7;
	IF T>B THEN
		BEGIN
		OUTSTR("CLIP LEVELS REVERSED - CLIPRANGE"&CRLF);
		TCLIP↔BCLIP;
		END;
	IF TCLIP=T∧BCLIP=B THEN RETURN(TRUE);
	TCLIP←T;
	BCLIP ← B;
	TVRESET;
	RETURN(FALSE);
	END;

α	accomodation test routine - XX, YY must be set before calling;

SIMPLE BOOLEAN PROCEDURE TEST1;
	BEGIN
	IF ¬STVFL THEN TVIN;
	I1 ← GETPNT(X, Y);
	I2 ← GETPNT(XX, YY);
	RETURN(ABS(I1-I2)≥11);
	END;
α	ACC - general accomodation routine;

PROCEDURE ACC;
	BEGIN
	SAFEX BOOLEAN ARRAY TDAC[0:63];
	INTEGER I, J, MX, MN, AD, K, MDAC;
	LABEL L1, A, C;

	α	QUICK INITIAL TEST FOR AUTOTARGET LIMIT;

	IF TEST1∧(((¬I1∨¬I2)∧BCLIP=7∧(TVCAM≠1∨AUTO_ACC=DAC_ACC))
		∨(TVCAM=2∧(I1 MAX I2)=15∧¬TCLIP))
	      ∧¬CHANGE_ACC∧BCLIP=TCLIP THEN RETURN;

	α	INIT LEGAL DAC TABLE;

	MDAC ← 2;
	TDAC[63] ← FALSE;
	TDAC[AUTO_ACC+1] ← FALSE;
	TDAC[AUTO_ACC] ← TRUE;
	ARRBLT(TDAC[AUTO_ACC+1],TDAC[AUTO_ACC],62-AUTO_ACC);
	IF BCLIP<7∨TCLIP THEN
		BEGIN BCLIP ← 7; TCLIP ← 0; TVRESET; END;

	α	ADJUST DAC AS NECESSARY AND POSSIBLE;

L1:	IF TEST1∨TVCAM≠1 THEN GO TO A;
	MN ← I1 MIN I2;
	MX ← I1 MAX I2;
	IF (¬MN∧MX=15)∨(MN>0∧MX<15)∨(MX-MN)≥11 THEN GO TO A;
	IF MN THEN
		BEGIN "MN"
		FOR I←1 STEP 1 UNTIL MDAC+1 DO IF ¬TDAC[DAC_ACC+I] THEN DONE;
		I ← I-1;
		IF ¬I THEN GO TO A;
		J ← DAC_ACC;
		TABLE_ACC[DAC_ACC+I] ← DACO(DAC_ACC+I);
		WHILE TDAC[J] DO BEGIN TDAC[J]←FALSE; J←J-1; END;
		GO TO L1;
		END "MN";
	AD ← 0;
	FOR I←1 STEP 1 UNTIL MDAC+1 DO IF ¬TDAC[DAC_ACC-I] THEN DONE;
	I ← I-1;
	IF ¬I THEN
		BEGIN
		IF (DAC_ACC-1>AUTO_ACC)∨¬CHANGE_ACC THEN GO TO A;
		I ← MDAC ← 1;
		TABLE_ACC[DAC_ACC] ← AD ← DDACO(-1);
		END;
	J ← DAC_ACC;
	I ← TABLE_ACC[DAC_ACC-I] ← DACO(DAC_ACC-I);
	IF AD THEN
		BEGIN "AD"
		IF ABS(AD-I)<10 THEN
			BEGIN
			DAC_ACC ← J;
			CHANGE_ACC ← FALSE;
			GO TO A;
			END;
		AUTO_ACC←DAC_ACC;
		TDAC[AUTO_ACC] ← TRUE;
		TDAC[AUTO_ACC-1] ← FALSE;
		END "AD";
	WHILE TDAC[J] DO BEGIN TDAC[J] ← FALSE; J ← J+1; END;
	GO TO L1;

	α	adjust clips for proper output;

A:	WHILE ¬CLIPSET(I1,I2)∧¬TEST1∧TCLIP≠BCLIP DO;
	IFTYPE OUTSTR("TCLIP="&CVS(TCLIP)&"     BCLIP="&CVS(BCLIP)&CRLF);
	END;
α	VERIFY - the verification message procedure (SCAN);

α	X1, Y1 is the coordinate of the starting point
	X2, Y2 is the coordinate of the ending point
	TV is the number of the camera to use
	COLOR is the number of the color filter to use (0-3)
		anything else for all filters
	FLAG is TRUE to scan entire space between points,
		FALSE to scan until two successive failures found

	returns message procedure VER_RESULT with integer array
		argument RESULT[0:N,0:2] where N is the number of
		tests, RESULT[i,0],RESULT[i,1] is the coordinate of
		the point on (X1,Y1)-(X2,Y2) about which the test
		was made, RESULT[i,2] is the test result (boolean)
		RESULT[0,0] contains N, RESULT[0,1] contains the
		number of successful tests, RESULT[0,2] contains
		the % of sucessful tests	;

MESSAGE PROCEDURE VERIFY(INTEGER X1,Y1,X2,Y2,TV,COLOR; BOOLEAN FLAG);
	BEGIN "VERIF"
	INTEGER P1X,P2X,P1Y,P2Y,W2,CLP1,CLP2,RIG,BOT,REACNT,CNT,N,T,I;
	REAL XINC,YINC,REA,QNOISE,TX,TY,LW,LNM,A,B,C,D,AV1,AV2,OFFSET,
		DI,OFFSAVE,OFFH,SHFT;
	SAFEX INTEGER ARRAY VALUES[1:L*W*2];
	BOOLEAN OUTSID;

	α return X,Y coordinates of point in rectangle given by:
		TX,TY is coordinate of point on line
		OFFSET is offset from line
		DI is index from offset
		I,J are indicies in rectangle (0≤I≤L-1, 0≤J≤W-1)
	OUTSID set TRUE if point outside buffer, not changed otherwise;

	SIMPLE PROCEDURE SCAN(REAL DI;INTEGER I, J);
		BEGIN
		REAL IND;

		IND ← OFFSET+DI+(IF DI>0 THEN J ELSE -J);
		X ← TX+D*IND+C*I-A+.5;
		Y ← TY-C*IND+D*I-B+.5;
		IF ¬(0≤X≤RIG∧0≤Y≤BOT) THEN
			BEGIN "SCANA"
			OUTSID ← TRUE;
			OUTSTR("POINT OUTSIDE BUFFER - VERIFY"&CRLF);
			END "SCANA";
		END;
α	VERIFY cont. (SCANSET, HSTGRM, COLWHEEL)	;

	α set up constants for scanning the operator;

	PROCEDURE SCANSET;
		BEGIN
		REAL TF;

		A ← P2Y-P1Y;
		B ← P2X-P1X;
		TF ← SQRT(A↑2+B↑2);
		C ← B/TF;
		D ← A/TF;
		N ← TF/L;
		IF N>15.0∧FLAG THEN N←15.0;
		XINC ← B/N;
		YINC ← A/N;
		A ← C*L/2.0;
		B ← D*L/2.0;
		W2 ← W%2;
		IF W2<1 THEN W2←1;
		END;

	α calculate histogram for current half of window;

	SIMPLE PROCEDURE HSTGRM;
		BEGIN "HSTG"
		INTEGER I, INTN, J;

		FOR I←0 STEP 1 UNTIL 16 DO HISTO[I]←0;
		FOR I←L-1 STEP -1 UNTIL 0 DO
		    FOR J←W-1 STEP -1 UNTIL 0 DO
			BEGIN
			SCAN(DI,I,J);
			IF OUTSID THEN RETURN;
			INTN←GETPNT(X,Y);
		        HISTO[INTN]←HISTO[INTN]+1;
			END;
		FOR I←0 STEP 1 UNTIL 15 DO HISTO[16]←HISTO[16]+HISTO[I];
		END "HSTG";

	α change color filter;

	SIMPLE PROCEDURE COLWHEEL(INTEGER I);
		IF COLFILT_ACC≠I THEN 
			BEGIN INTEGER N;
			CWHEEL(COLFILT_ACC←I); 
			N←20000 ;
			WHILE N>0 DO N←N-1;
			END ;
α	VERIFY cont. (CNTRST, FINECALL)	;

	α computes contrast achieved under present accomodation;

	SIMPLE REAL PROCEDURE CNTRST;
		BEGIN "CNTR"
		INTEGER I, J;
		REAL AVG1,AVG2;

		IF ¬STVFL THEN TVIN;
		OUTSID ← FALSE;
		CLP1 ← CLP2 ← 0;
		HSTGRM;
		IF OUTSID THEN RETURN(0);
		AVG1←0;
		FOR I←1 STEP 1 UNTIL 15 DO AVG1←AVG1+I*HISTO[I];
		AVG1←AVG1/HISTO[16];
		CLP1←HISTO[0]+HISTO[15];
		DI←-DI;
		HSTGRM;
		DI←-DI;
		IF OUTSID THEN RETURN(0);
		AVG2←0;
		FOR I←1 STEP 1 UNTIL 15 DO AVG2←AVG2+I*HISTO[I];
		AVG2←AVG2/HISTO[16];
		CLP2←HISTO[0]+HISTO[15];
		AVG2←AVG2-AVG1;
		RETURN(ABS(AVG2));
		END "CNTR";

	α accomodates for maximum contrast;

	SIMPLE REAL PROCEDURE FINECALL;
		BEGIN
		OUTSID ← FALSE;
		SCAN(DI,L/2,W2);
		XX ← X;
		YY ← Y;
		SCAN(-DI,L/2,W2);
		IF OUTSID THEN RETURN(0);
		ACC;
		RETURN(CNTRST);
		END;
α	VERIFY cont. (DPYSHW)	;

	α debugging display outputs points used in test and values
	  then waits for input - P dumps current buffer and
	  N terminates debugging for this call;

ifc distst thenc

	PROCEDURE DPYSHW(REAL VAL1, VAL2);
		BEGIN
		INTEGER I,J, K, A1, A2;
		SAFE INTEGER ARRAY BUF[1:100];

		GETFORMAT(A1,A2);
		J ← GETPOG;
		IF J<0 THEN BEGIN OUTSTR("NO FRAME"&CRLF); RETURN; END;
		SETFORMAT(10,3);
		DPYSET(BUF);
		DPYBRT(1);
		DPYBIG(2);
		FADCHG(0,0,AIVECT);
		FOR I←L-1 STEP -1 UNTIL 0
		    DO FOR K←W-1 STEP -1 UNTIL 0 DO
			BEGIN
			SCAN(DI,I,K);
			FRDCHG(X+LSIDE,Y+FLINE,RPOINT);
			SCAN(-DI,I,K);
			FRDCHG(X+LSIDE,Y+FLINE,RPOINT);
			END;
		FRDCHG(100,300,RIVECT);
		DPYSST("V1="&CVF(VAL1)&"  V2="&CVF(VAL2));
		DPYOUT(J);
		I ← INCHWL;
		IF I="P" THEN PICSPL(TRUE,"VERIFIER DUMP");
		IF I="N" THEN BEGIN DEBUGX ← FALSE; RELPOG(FRA); END;
		RELPOG(J);
		SETFORMAT(A1,A2);
		END;

	elsec

	PROCEDURE DPYSHW(REAL A,B);
		RETURN;

	endc;
	α VERIFY cont. (TSIG-line significance function)	;

	SIMPLE REAL PROCEDURE TSIG;
		BEGIN "STT"
		REAL SP, SM, SPQ, SMQ, SIGP, SIGM, I1, I2;
		INTEGER I, J, K;
		LABEL OUTS;

		K ← OUTSID ← SP ← SM ← SPQ ← SMQ ← 0;
		IF ¬STVFL THEN TVIN;
		FOR I← L-1 STEP -1 UNTIL 0
		    DO FOR J←W-1 STEP -1 UNTIL 0 DO
			BEGIN "STTA"
			SCAN(DI,I,J);
			IF OUTSID THEN RETURN(0);
			K←K+1;
			VALUES[K] ← I1 ← GETPNT(X,Y);
			SCAN(-DI,I,J);
			IF OUTSID THEN RETURN(0);
			K ← K+1;
			VALUES[K] ← I2 ← GETPNT(X,Y);
			SP ← SP+I1;
			SPQ ← SPQ+I1↑2;
			SM ← SM+I2;
			SMQ ← SMQ+I2↑2;
			END;
		AV1 ← SP/LW;
		AV2 ← SM/LW;
		SIGP ← (SPQ-SP↑2/LW)/LNM MAX QNOISE;
		SIGM ← (SMQ-SM↑2/LW)/LNM MAX QNOISE;
		IF DEBUGX THEN
			BEGIN
			INTEGER A,B;
			GETFORMAT(A,B);
			SETFORMAT(3,0);
			FOR K←1 STEP 2 UNTIL LW*2 DO
				OUTSTR(CVS(VALUES[K]));
			OUTSTR("|||");
			FOR K←2 STEP 2 UNTIL LW*2 DO
				OUTSTR(CVS(VALUES[K]));
			OUTSTR(CRLF);
			SETFORMAT(A,B);
			END;
		RETURN(ABS((SP-SM)/(SQRT((SIGP+SIGM)/LW)*LW)));
		END "STT";
α	VERIFY cont. (COLINT - chooses color filter for best contrast)	;

	SIMPLE PROCEDURE COLINT;
		BEGIN "COLINT"
		LABEL MX;
		REAL HIAVG;
		INTEGER I,IMAX, A, B;

		GETFORMAT(A,B);
		SETFORMAT(0,3);
		DI←4.0;
		TX ← P1X + XINC*N/2;
		TY ← P1Y + YINC*N/2;
		FOR IND←3,1,0,2 DO
			BEGIN "COLCHG"
			IF COLFLG∧COLOR≠IND THEN CONTINUE;
			COLWHEEL(IND);
			IF ¬FIL_ACC[IND]∨CHANGE_ACC THEN
				BEGIN
				SENSINIT;
				FIL_ACC[IND] ← AUTO_ACC;
				END ELSE AUTO_ACC ← FIL_ACC[IND];
			CONVLT[IND,1]←FINECALL;
			CONVLT[IND,2]←DAC_ACC;
			IFTYPE OUTSTR((CASE IND OF ("RED","BLUE","GREEN",
				"CLEAR"))&"FILTER:	CONTRAST="&
				CVF(CONVLT[IND,1])&"   DAC_ACC="&
				CVF(CONVLT[IND,2])&CRLF);
			IF CONVLT[IND,1]≥11.0 THEN GO TO MX;
			END "COLCHG";
		IF ¬COLFLG THEN
			BEGIN "GETMAX"
			IMAX←3;
			HIAVG←CONVLT[3,1];
			FOR I←2 STEP -1 UNTIL 0 DO
			    IF CONVLT[I,1]>HIAVG THEN 
				BEGIN HIAVG←CONVLT[I,1]; IMAX←I; END;
			COLWHEEL(IMAX);
		 	IF TVCAM=1 THEN 
				BEGIN
				IF CONVLT[IMAX,2]≠DAC_ACC THEN 
					DACO(CONVLT[IMAX,2]);
				AUTO_ACC←FIL_ACC[IMAX];
				END;
			END "GETMAX";
MX:		IFTYPE OUTSTR("BEST FILTER IS "&(CASE COLFILT_ACC OF
			("RED","BLUE","GREEN","CLEAR")) & CRLF);
		SETFORMAT(A,B);
		END "COLINT";
α	VERIFY - start of body - initialize;

	TVCAM ← TV;
	DEBUGX ← DEBUG∨DEB_VER;
	LW ← L*W;
	LNM ← LW-1;
	FLINE ← ((Y1 MIN Y2)-20) MAX 15;
	LLINE ← ((Y1 MAX Y2)+20) MIN 250;
	LSIDE ← ((X1 MIN X2)-20) MAX 15;
	RSIDE ← ((X1 MAX X2)+20) MIN 330;
	BOT ← LLINE-FLINE+1;
	RIG ← RSIDE-LSIDE+1;
	P1X ← X1-LSIDE;
	P2X ← X2-LSIDE;
	P1Y ← Y1-FLINE;
	P2Y ← Y2-FLINE;
	I ← ((RIG DIV 9)+1)*BOT;
	SCANSET;
		BEGIN "INNER"
		SAFEX INTEGER ARRAY BUFR[0:I], RESULT[0:N,0:2];
		TVWORD ← GIOWD(BUFR);
		INTPNT;
		TVRESET;	
		CWHEEL(6);
		COLFILT_ACC ← IND;
		COLFLG ← 0≤COLOR≤3;
		COLINT;
		DI←1.5;
		CNT ← OFFSET←REACNT←0;
		QNOISE ← ((1+BCLIP-TCLIP)/256)↑2;
		TX ← P1X+XINC;
		TY ← P1Y+YINC;
		OK ← TRUE;

ifc distst thenc

		IF DEBUGX THEN
			BEGIN 
			FRA ← GETPOG;
			IF FRA<0 THEN OUTSTR("NO FRAME"&CRLF) ELSE
				BEGIN SAFE INTEGER ARRAY BUF[1:20];
				DPYSET(BUF);
				FADCHG(LSIDE,FLINE,AIVECT);
				FRDCHG(RSIDE,FLINE,RVECT);
				FRDCHG(RSIDE,LLINE,RVECT);
				FRDCHG(LSIDE,LLINE,RVECT);
				FRDCHG(LSIDE,FLINE,RVECT);
				DPYOUT(FRA);
				END;
			END;
	endc;
α	VERIFY body cont. - main loop;

		FOR T←4 STEP 1 UNTIL N DO
			BEGIN "LOOP"
			LABEL L1,L2;

			CNT ← CNT+1;
			TX ← TX+XINC;
			TY ← TY+YINC;
			REA←TSIG;
			IF DEBUGX THEN DPYSHW(REA,OFFSET);
			SHFT ← 0;
			OFFH ← OFFSAVE←OFFSET;
			IF REA<TTEST THEN
			    BEGIN "ACO"
			    IF TCLIP≠BCLIP∨¬(1.≤AV1≤14.)∨¬(1.≤AV2≤14.)
				THEN BEGIN
				FINECALL;
				QNOISE ← ((1+BCLIP-TCLIP)/256)↑2;
				REA ← TSIG;
				IF DEBUGX THEN DPYSHW(REA,OFFSET);
				IF REA≥TTEST THEN GO TO L1;
				END;
			    WHILE TRUE DO
				BEGIN "SHIFT"
				SHFT←IF SHFT≤0 THEN ABS(SHFT)+1.0 ELSE -SHFT;
				OFFSET ← OFFH+SHFT;
				IF ABS(OFFSET)>5.0∨ABS(SHFT)>2.0 THEN
				    BEGIN
				    OFFSET ← OFFSAVE;
				    GO TO L2;
				    END;
				REA ← TSIG;
				IF DEBUGX THEN DPYSHW(REA,OFFSET);
				IF REA≥TTEST THEN
				    BEGIN
				    OFFSAVE ← OFFSET;
				    DONE;
				    END;
			 	END "SHIFT";
			    END "ACO";
L1:			REACNT←REACNT+1;
			OK ← TRUE;
L2:			OFFSET ← OFFSAVE;
			I ← REA≥TTEST;
			RESULT[CNT,0] ← TX+LSIDE;
			RESULT[CNT,1] ← TY+FLINE;
			RESULT[CNT,2] ← I;
			IF ¬I THEN IF OK THEN OK←FALSE ELSE
				IF ¬FLAG THEN DONE;
			END "LOOP";
α	VERIFY body cont. - return results	;

		RESULT[0,0] ← CNT;
		RESULT[0,1] ← REACNT;
		RESULT[0,2] ← (REACNT*100+CNT-1) DIV CNT;
		IF EQU(JOB,"TTY") THEN
			BEGIN "TYPE"
			OUTSTR(CRLF);
			IF DEBUGX THEN  FOR I←1 STEP 1 UNTIL CNT DO
			    OUTSTR(CVS(RESULT[I,0])&","&CVS(RESULT[I,1])
				&"    "&(IF RESULT[I,2]
				THEN "TRUE" ELSE "FALSE")&CRLF);
			FOR I←0 STEP 1 UNTIL 2 DO
				OUTSTR(CVS(RESULT[0,I])&"    ");
			OUTSTR("%"&CRLF);
			END "TYPE" ELSE
			ISSUE(5,"VERIFY",JOB,MESSAGE VER_RESULT(RESULT));
		END "INNER";

ifc distst thenc

	RELPOG(FRA);

	endc;

	END "VERIF";
α	main program starts here;

PUT_DATA(0,0,"VERIFY");
YES_VER ← TRUE;
FRA ← -1;
SETFORMAT(0,0);
XM ← 160;
YM ← 125;
L ← LENG;
W ← WIDTH;
WHILE TRUE DO
    IF RUN THEN
	BEGIN "MONMOD"
	INTEGER MESS;
	MESS ← GET_ENTRY('160,NULL,"VERIFY","VERIFY");
	JOB ← GET_DATA(1,MESS);
	QUEUE('600,MESS);
	END "MONMOD" ELSE BEGIN "TTYMOD"
	INTEGER COL, FLG;
	JOB ← "TTY";
	OUTSTR("DEBUG?"&CRLF);
	DEBUG ← INCHWL="Y";
	TYP_VER ← TRUE;
	OUTSTR("TV= ");
	TVCAM ← CVD(INCHWL);
	OUTSTR("FILTER (0=RED, 1=BLUE, 2=GREEN, 3=WHITE, -1=ALL) = ");
	COL ← CVD(INCHWL);
	WHILE TRUE DO
		BEGIN "CALL"
		IF DEBUG THEN
			BEGIN
			OUTSTR("CHANGE OPERATOR?"&CRLF);
			IF INCHWL="Y" THEN
				BEGIN
				OUTSTR("LENGTH="&CRLF);
				L ← CVD(INCHWL);
				OUTSTR("WIDTH="&CRLF);
				W ← CVD(INCHWL);
				END;
			END;
		OUTSTR("POINT 1="&CRLF);
		IF ¬SETCOR(X,Y) THEN DONE;
		OUTSTR("POINT 2="&CRLF);
		IF ¬SETCOR(XX,YY) THEN DONE;
		OUTSTR("WHOLE LINE?");
		FLG ← INCHWL="Y";
		VERIFY(X,Y,XX,YY,TVCAM,COL,FLG);
		END "CALL";
	END "TTYMOD";
END "VERIFY";